package tech.aistar.day14;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 本类用来演示: 反射技术来操作类中的字段信息
 *
 * @author: success
 * @date: 2021/3/25 9:50 上午
 */
public class TestFieldDemo {
    public static void main(String[] args) {
        //1. 获取Point对应的class实例
        Class<?> c = Point.class;

        //2.
        try {
            Field x = c.getDeclaredField("x");
            System.out.println(x);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        System.out.println("===反射获取字段的元信息===");
        //3. 获取类中所有的字段 - 映射到反射的API类 - Field类
        Field[] fields = c.getDeclaredFields();
        System.out.println(fields.length);//2

        for (int i = 0; i < fields.length; i++) {
            //访问修饰符
            System.out.print(Modifier.toString(fields[i].getModifiers())+" ");

            //获取属性的类型
            System.out.print(fields[i].getType().getSimpleName()+" ");
            //获取属性的名称
            System.out.println(fields[i].getName());
        }

        System.out.println("===反射设置指定字段的值===");
        //先获取x对应的Field
        try {
            //反射可以调用构造方法[空参] - 反射可以创建对象
            Point p = (Point) c.newInstance();

            Field xField = c.getDeclaredField("x");

            //如果x是私有的,在设置私有的属性之前一定要先设置它为可访问的
            xField.setAccessible(true);

            xField.set(p,10);

            System.out.println(p);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}
